package cn.tedu.scalafunction

/**
 * @author Amos
 * @date 2022/5/17
 */

object Function {
  def main(args: Array[String]): Unit = {

    // 函数完整写法
//    val sum1:(Int,Int) => Int = (a:Int,b:Int) => {a+b}
    val sum1:(Int,Int) => Int = (a,b) => {a+b}


    // 定义函数，求a b的和, 简化的格式为val sum = () => {}
    val sum = (a: Int, b: Int) => a+b

    println(sum) // 打印函数对象的地址
    println(sum(3,7))

    // 打印输出hello world
    val printHello = () => {println("hello world")}

    println(printHello)
    printHello() // 区别于方法，函数的括号不能省略

    println("*" * 100)

    // 定义方法，实现a b两个数据的操作
    def process(a:Int,b:Int,f:(Int,Int)=>Int)={
      f(a,b)
    }

    // 匿名函数
    println(process(3, 7, (x: Int, y: Int) => {x + y}))
    println(process(3, 7, (x: Int, y: Int) => {y - x}))

    // 函数的参数是函数,有val和=>标识的就是函数
    val processfunc = (a:Int,b:Int,f:(Int,Int)=>Int) => {f(a,b)}

    println(processfunc(3,7,(x,y)=>{x*10+y}))

    // 方法或者函数的返回值是函数
    def returnFunc(n:Int)={
      val func = (a:Int,b:Int) => {
        n*a + n*b
      }
      func
    }

    // returnFunc(10)的返回值是函数，返回值函数还需要传参
    println(returnFunc(10)(3, 6))

    // 参数和返回值都是函数
    def iofunc(a:Int,b:Int,f1:(Int,Int)=>Int)={

      // 定义一个返回值函数
      val f2 = (n:Int) => {
        n * f1(a,b)
      }
      f2
    }

    println(iofunc(3,7,(x,y) =>{x+y})(15))

  }
}